package demo;

import java.util.LinkedList;
import java.util.List;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

public class PruebaJavassist {
	
	private ClassPool source;
	
	private List<String> metodosALogear;
	
	public PruebaJavassist() {
		source = ClassPool.getDefault();
		metodosALogear = new LinkedList<String>();
	}

	public void aspectearClase(String nombreClase) throws NotFoundException, CannotCompileException {
		CtClass ctClass = source.get(nombreClase);
		CtMethod[] metodos = ctClass.getMethods();
		for(CtMethod metodo:metodos) {
			if(logeoMetodo(metodo.getName())) {
				metodo.insertBefore("{System.out.println(\"Estoy por ejecutar el metodo " + metodo.getName() + "\");}");
				metodo.insertAfter("{System.out.println(\"Termino el metodo " + metodo.getName() + ".\");}");
			}
		}
		ctClass.toClass();
		/*
		Esto seguro que nos va a servir!!!
		ctClass.toBytecode(out)
		podemos grabar el .class con eso
		*/
	}
	
	public void logearMetodo(String nombre) {
		this.metodosALogear.add(nombre);
	}

	private boolean logeoMetodo(String name) {
		return metodosALogear.contains(name);
	}
}
